package com.wayne.plugin;

import com.sun.org.slf4j.internal.Logger;
import com.sun.org.slf4j.internal.LoggerFactory;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.plugin.*;

import java.sql.Connection;
import java.util.Properties;

@Intercepts({
    // 可以定义多个@Signature 对多个地方拦截，都用这个拦截器
    @Signature(
        // 拦截哪个接口
        type = StatementHandler.class,
        // 拦截接口的哪个方法
        method = "prepare",
        // 拦截接口的方法的参数 顺序，类型都需要保持一致，不能多不能少，防止出现方法重载，只有通过名称和入参来确定唯一
        args = {Connection.class, Integer.class}
    )
})
public class MyPlugin implements Interceptor {
  private final Logger logger = LoggerFactory.getLogger(MyPlugin.class);

  // 拦截方法：只要被拦截的目标对象的目标方法被执行时，每次都会执行intercept方法
  @Override
  public Object intercept(Invocation invocation) throws Throwable {
    // 增强逻辑

    return invocation.proceed();  // 执行原方法
  }

  /**
   * 主要是为了把这个拦截器生产的代理放到拦截器链中
   *
   * @param target 为要拦截的对象
   * @return 代理对象
   * @description 包装目标对象，为目标对象创建代理对象
   */
  @Override
  public Object plugin(Object target) {
    logger.warn("要包装的对象：" + target);
    return Plugin.wrap(target, this);
  }

  /**
   * 插件初始化的时候调用，也只调用一次，插件配置的属性从这里设置进来
   *
   * @param properties
   */
  @Override
  public void setProperties(Properties properties) {
    logger.warn("插件配置的初始化参数：" + properties);
  }
}
